package com.ynet.middleground.contract.service;

import java.util.List;

import javax.validation.Valid;

import com.ynet.core.common.ServiceResult;
import com.ynet.middleground.contract.bean.*;
import com.ynet.middleground.contract.dto.*;

/**
 * @author liulx
 * @description 签名签章接口定义
 * @date 2020-04-11 23:10
 */
public interface SignService {

    /**
     * 文本签加密
     *
     * @param textSignReq 文本签请求类
     * @return 文本签结果数据
     */
    ServiceResult<TextSignResultDTO> textSign(@Valid TextSignReq textSignReq);

    /**
     * 文本签验签服务
     * 
     * @param verifyTextSignReq 文本签验签请求类
     * @return 文本签名证书信息
     */
    ServiceResult<EsignCertDTO> verifyTextSign(@Valid VerifyTextSignReq verifyTextSignReq);

    /**
     * pdf 文档验签
     * 
     * @param verifyPdfSignReq pdf 文档验签请求信息
     * @return pdf 文档所有签名信息列表
     */
    ServiceResult<List<SignBeanDTO>> verifyPdfSign(@Valid VerifyPdfSignReq verifyPdfSignReq);

    /**
     * 时间戳加戳
     * 
     * @param timestampReq 时间戳加戳请求信息
     * @return 加戳后数据包
     */
    ServiceResult<String> requestTimestamp(@Valid TimestampReq timestampReq);

    /**
     * 时间戳验签
     * 
     * @param verifyTimestampReq 时间戳验签请求信息
     * @return 结果标志，以 success 字段值标识 true/false
     */
    ServiceResult verifyTimestamp(@Valid VerifyTimestampReq verifyTimestampReq);

    /**
     * 发送签署验证短信，调用此接口后，签署时需要调用相应的短信验证签署接口
     * 
     * @param sendSignMobileCodeReq 发送签署短信验证码类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    ServiceResult sendSignMobileCode(@Valid SendSignMobileCodeReq sendSignMobileCodeReq);

    /**
     * 指定手机发送签署短信验证码，调用此接口后，签署时需要调用相应的平台用户PDF文件批量签署（指定手机号短信验证）
     * 
     * @param sendAppointSignMobileCodeReq
     * @return 结果标志，以 success 字段值标识 true/false
     */
    ServiceResult sendAppointSignMobileCode(@Valid SendAppointSignMobileCodeReq sendAppointSignMobileCodeReq);

    /**
     * PDF 摘要签署（短信验证）
     *
     * @param signPdfReq PDF 文件签署请求类
     * @return 文件签署结果
     */
    ServiceResult<SignedResultDTO> userSignPdf(@Valid SignPdfReq signPdfReq);

    /**
     * e 签宝-平台用户PDF文件批量签署（指定手机号短信验证）
     *
     * @param batchSignPdfAppointMobileReq 平台用户PDF文件批量签署（指定手机号短信验证）请求类
     * @return 文件签署结果
     */
    ServiceResult<MultiSignedResultDTO>
        batchSignAppointMobilePdfReq(@Valid BatchSignPdfAppointMobileReq batchSignPdfAppointMobileReq);

    /**
     * PDF 批量摘要签署（短信验证）
     *
     * @param batchSignPdfReq PDF 文件批量签署（短信验证）请求类
     * @return 文件签署结果
     */
    ServiceResult<MultiSignedResultDTO> batchSignPdfReq(@Valid BatchSignPdfReq batchSignPdfReq);

    /**
     * e签宝-平台用户无认证PDF文件签署
     * 
     * @param signWithoutAuthReq
     * @return 文件签署结果
     */
    ServiceResult<SignWithoutAuthResultDTO> signWithoutAuth(@Valid SignWithoutAuthReq signWithoutAuthReq);

    /**
     * 上传文件并同时调用 e签宝无认证 PDF 文件签署，对文件进行签章
     * 
     * @param uploadFileAndSignWithoutAuthReq 上传文件并进行无认证签章请求信息
     * @return 文件签署结果
     */
    ServiceResult<UploadAndSignWithoutAuthResultDTO>
        uploadFileAndSignWithoutAuth(@Valid UploadFileAndSignWithoutAuthReq uploadFileAndSignWithoutAuthReq);

    /**
     * 批量文件意愿签署（用于人脸确认）
     *
     * @param signPdfWithWillnessReq PDF 文件意愿签署请求类
     * @return 批量签署结果
     */
    ServiceResult<MultiSignedResultDTO> batchWillnessSignPdf(@Valid SignPdfWithWillnessReq signPdfWithWillnessReq);

    /**
     * 获取意愿地址
     *
     * @param createSignAuthReq 获取意愿地址请求类
     * @return 意愿任务信息
     */
    ServiceResult<SignAuthBizDTO> createSignAuth(@Valid CreateSignAuthReq createSignAuthReq);

    /**
     * 查询意愿状态
     *
     * @param queryWillAuthReq 获取意愿地址请求类
     * @return 意愿状态信息
     */
    ServiceResult<WillAuthDTO> queryWillAuth(@Valid QueryWillAuthReq queryWillAuthReq);

    /**
     * cfca 自动化计算 pdf 签署 hash 值
     *
     * @param calculatePdfHashReq 计算 pdf 签章 hash 值请求类
     * @return hash 值信息
     */
    ServiceResult<PdfHashDTO> autoCalculatePdfHash(@Valid CalculatePdfHashReq calculatePdfHashReq);

    /**
     * pdf 文档验签
     *
     * @param verifyPdfSignReq pdf 文档验签请求信息
     * @return pdf 文档所有签名信息列表
     */
    ServiceResult<List<SignedCertDTO>> verifyPdfSignByCfca(@Valid VerifyPdfSignReq verifyPdfSignReq);

    /**
     * Pdf合成外部签名
     * 
     * @param synthesizeOuterSignatureReq Pdf合成外部签名请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    ServiceResult synthesizeOuterSignature(@Valid SynthesizeOuterSignatureReq synthesizeOuterSignatureReq);

}
